home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / util / shell / cfn.lha / cfn / cfnlite.e < prev    next >
Text File  |  1995-05-05  |  7KB  |  316 lines

  1. /* Ingen window shuffle! */
  2. /* Implementerar också filename completion med tab */
  3. /* Tar första match, nästa tryckning tar nästa match osv.. */
  4. /* Kompilerar EJ med E v3.1 */
  5. OPT STACK=$CDAB       /* Så att den känns igen med NewZap */
  6.               /* lagom storlek $0800 (2048) bytes */
  7. CONST FBUF=80
  8.  
  9. MODULE 'keymap'
  10. MODULE 'utility'
  11. MODULE 'exec/ports'
  12. MODULE 'exec/tasks'
  13. MODULE 'exec/types'
  14. MODULE 'exec/interrupts'
  15. MODULE 'exec/nodes'
  16. MODULE 'exec/io'
  17. MODULE 'exec/memory'
  18. MODULE 'intuition/screens'
  19. MODULE 'intuition/intuition'
  20. MODULE 'devices/input'
  21. MODULE 'devices/inputevent'
  22. MODULE 'dos/dos'
  23. MODULE 'dos/dosextens'
  24.  
  25. OBJECT memess /* från Notify */
  26.    mess     : mn
  27.    wind     : LONG
  28.    process    : LONG
  29. ENDOBJECT
  30. OBJECT toraw
  31.    cd        : CHAR
  32.    qu        : CHAR
  33. ENDOBJECT
  34.  
  35. DEF fib:PTR TO fileinfoblock /* global så att värdena sparas */
  36. DEF old_lock,path_lock,todel
  37. DEF glob_event:inputevent
  38. DEF bb[81]:ARRAY,bbp
  39. DEF lastproc:PTR TO process,lastwin,okwin,flag,
  40.     wins[10]:ARRAY OF LONG,procs[10]:ARRAY OF LONG
  41. DEF task:PTR TO tc
  42. DEF sig
  43. DEF bufw:PTR TO inputevent, buf[5]:ARRAY OF inputevent, bufr:PTR TO inputevent
  44. DEF bufend
  45. DEF port:PTR TO mp
  46. DEF io_req:PTR TO iostd
  47.  
  48. PROC main()
  49. DEF handler:is
  50. DEF lnpek:PTR TO ln,t,s
  51.     bufr:=buf; bufw:=buf; bufend:=5*SIZEOF inputevent + buf
  52.     FOR t:=0 TO 4 DO buf[t].class:=IECLASS_RAWKEY
  53.     IF (fib := New(SIZEOF fileinfoblock)) = 0 THEN CleanUp(20)
  54.     IF openlibs() THEN CleanUp(20)
  55.     sig:=Shl(1,(s:=AllocSignal(-1)))
  56.     task:=FindTask(NIL)
  57.     SetTaskPri(task,5)
  58.     IF (port:=CreateMsgPort())
  59.       lnpek:=port.ln
  60.       lnpek.name:='Shuffle'
  61.       AddPort(port)
  62.       IF (io_req:=CreateIORequest(port,SIZEOF iostd))
  63.     IF OpenDevice('input.device',0,io_req,0) = NIL
  64.       handler.code:={handeven}
  65.       MOVE.L A4,t
  66.       handler.data:=t
  67.       lnpek:=handler.ln
  68.       lnpek.pri:=6;  /* just before console */
  69.       lnpek.name:='Shuffle';
  70.       io_req.data:=handler;
  71.       io_req.command:=IND_ADDHANDLER;
  72.       DoIO(io_req);
  73.       serve_handler();  /* never returns... */
  74.       io_req.data:=handler;
  75.       io_req.command:=IND_REMHANDLER;
  76.       DoIO(io_req);
  77.       /*  ELSE
  78.       WriteF('No input.device') */
  79.     ENDIF
  80.     DeleteIORequest(io_req)
  81.     /*    ELSE
  82.     WriteF('No CreateIORequest') */
  83.       ENDIF
  84.       RemPort(port)
  85.       DeleteMsgPort(port)
  86.   /*  ELSE
  87.       WriteF('No CreateMsgPort') */
  88.     ENDIF
  89.     FreeSignal(s)
  90.     IF utilitybase THEN CloseLibrary(utilitybase)
  91.     IF keymapbase THEN CloseLibrary(keymapbase)
  92. ENDPROC
  93.  
  94. PROC observe_input()       /* Har hittat RawKey */
  95. DEF i
  96. IF Long(intuitionbase+52)<>lastwin /* bytt fönster */
  97.   bbp:=0
  98.   lastwin:=Long(intuitionbase+52)
  99.   i:=0
  100.   WHILE (i<10) AND (lastwin<>wins[i]) DO INC i
  101.   IF i<10
  102.     lastproc:=procs[i]
  103.     okwin:=TRUE
  104.   ELSE
  105.     lastproc:=NIL; okwin:=FALSE; flag := TRUE
  106.   ENDIF
  107. ENDIF
  108.  
  109. IF okwin
  110.   IF (glob_event.code = $42) AND (glob_event.qualifier = $8000)
  111.     glob_event.class := IECLASS_NULL
  112.     okwin:=FALSE   /* ta inte emot fler tecken innan sökningen färdig */
  113.   ENDIF
  114.   MOVE.L bufw,A1
  115.   MOVE.L glob_event,A0
  116.   MOVE.L 6(A0),6(A1)
  117.   MOVE.L 10(A0),10(A1)
  118.   ADDI.L #SIZEOF inputevent,bufw
  119.   IF bufw=bufend THEN bufw:=buf
  120.   Signal(task,sig)
  121. ENDIF
  122.  
  123. RETURN
  124.  
  125. handeven:
  126. MOVE.L    A0,-(A7)          /* Spara pekare InputEvent */
  127. notrawkey:
  128. MOVE.L    A0,D0          /* Slut ? */
  129. BEQ.S    nomore
  130. CMPI.B     #IECLASS_RAWKEY,4(A0)   /* Bara RAWKEY intress. */
  131. BEQ.S    rawkey
  132. MOVE.L    (A0),A0                 /* Kolla nästa */
  133. BRA.S    notrawkey
  134.  
  135. rawkey:
  136. MOVEM.L D1-D7/A0-A6,-(A7)       /* Fixa register inför proc. */
  137. MOVE.L    A1,A4            /* ladda A4 */
  138. MOVE.L    A0,glob_event
  139. observe_input()                 /* E-funktion */
  140. MOVEM.L (A7)+,D1-D7/A0-A6       /* Hämta register */
  141. MOVE.L    (A0),A0
  142. BRA.S    notrawkey
  143.  
  144. nomore:
  145. MOVE.L    (A7)+,D0                /* Avsluta */
  146. RTS
  147. ENDPROC
  148.  
  149. PROC clearit()    /* ta bort gamla lock */
  150. IF old_lock
  151.   bbp := StrLen(bb)
  152.   CurrentDir(old_lock)
  153.   IF path_lock THEN UnLock(path_lock)
  154.   old_lock := NIL
  155. ENDIF
  156. flag := NIL
  157. ENDPROC
  158.  
  159.  
  160. PROC serve_handler()
  161. DEF ms:PTR TO memess,t
  162. DEF t2
  163. bbp:=0
  164. LOOP
  165.   IF (Wait(Shl(1,port.sigbit)+sig+SIGBREAKF_CTRL_C) AND SIGBREAKF_CTRL_C) THEN RETURN
  166.   WHILE ms:=GetMsg(port)     /* Nytt fönster */
  167.     addwin(ms.wind,ms.process)
  168.     FreeMem(ms,SIZEOF memess)
  169.   ENDWHILE
  170.   WHILE bufr<>bufw
  171.     t:=bufr.code
  172.     t2 := ((t AND $7f) <> $42)
  173.     IF t2 OR flag
  174.       clearit()
  175.     ENDIF
  176.     SELECT t
  177.     CASE $42
  178.       IF bufr.qualifier=$8000    /* Här ska filnamnet kompletteras */
  179.     IF lastproc
  180.       todel := IF old_lock THEN StrLen(bb)-bbp ELSE 0
  181.       PutChar(bbp+bb,0)
  182.       IF old_lock
  183.         complete()
  184.       ELSE
  185.         old_lock:=CurrentDir(lastproc.currentdir)
  186.         t:=FilePart(bb)
  187.         t2:=Char(t)
  188.         PutChar(t,0)
  189.         IF (path_lock:=Lock(bb,ACCESS_READ))
  190.           PutChar(t,t2)
  191.           IF Examine(path_lock,fib)
  192.         complete()
  193.           ENDIF
  194.         ELSE
  195.           clearit()
  196.         ENDIF
  197.       ENDIF
  198.       feedit()
  199.       Delay(2)    /* Vänta på att inputströmmen är slut */
  200.       okwin:=TRUE
  201.     ENDIF
  202.       ENDIF
  203.     CASE $41            /* BS */
  204.       IF bbp>0 THEN DEC bbp
  205.     CASE $44            /* RETURN */
  206.       bbp:=0
  207.     CASE $4c            /* Arrow Up */
  208.       bbp:=0
  209.     CASE $4d            /* Arrow Down */
  210.       bbp:=0
  211.     CASE $4e            /* Arrow Right */
  212.       bbp:=0
  213.     CASE $4f            /* Arrow Left */
  214.       bbp:=0
  215.     CASE $40            /* Space */
  216.       bbp:=0
  217.     CASE $32            /* CTRL-x */
  218.       IF bufr.qualifier = $8008
  219.     bbp:=0
  220.       ELSE
  221.     bbp:=bbp+MapRawKey(bufr,bb+bbp,FBUF-bbp,NIL)
  222.       ENDIF
  223.  
  224.     DEFAULT
  225.       bbp:=bbp+MapRawKey(bufr,bb+bbp,FBUF-bbp,NIL)
  226.       IF (bbp=1) AND ((Char(bb)="<") OR (Char(bb)=">")) THEN bbp:=0
  227.     ENDSELECT
  228.     bufr:=bufr+SIZEOF inputevent
  229.     IF bufr=bufend THEN bufr:=buf
  230.   ENDWHILE
  231.  
  232. ENDLOOP
  233. ENDPROC
  234.  
  235. PROC addwin(wind:PTR TO window,process)
  236. DEF lock,s:PTR TO screen,i=0,w:PTR TO window
  237.   lock:=LockIBase(0)
  238.   s:=wind.wscreen
  239.   w:=s.firstwindow
  240.   WHILE i<10 AND w<>NIL
  241.     IF wind=wins[i]
  242.       procs[i]:=process
  243.       i:=10
  244.     ENDIF
  245.     IF w=wins[i]
  246.       w:=s.firstwindow
  247.       i:=i+1
  248.     ELSE
  249.       w:=w.nextwindow
  250.     ENDIF
  251.   ENDWHILE
  252.   IF i<10
  253.     wins[i]:=wind
  254.     procs[i]:=process
  255.     lastwin:=NIL
  256.   ENDIF
  257.   UnlockIBase(lock)
  258. ENDPROC
  259.  
  260. PROC openlibs()
  261. IF (utilitybase:=OpenLibrary('utility.library',37))
  262.   IF ((keymapbase:=OpenLibrary('keymap.library',37))=NIL) THEN CloseLibrary(utilitybase)
  263. ENDIF
  264. RETURN (utilitybase=NIL)+(keymapbase=NIL)
  265. ENDPROC
  266.  
  267. PROC complete()
  268. DEF comset,t,fnam,flen
  269. fnam:=FilePart(bb); flen:=StrLen(fnam);
  270.   LowerStr(fnam)
  271.   REPEAT
  272.     t:=ExNext(path_lock,fib)
  273.     LowerStr(fib.filename)
  274.     IF fib.direntrytype>0 THEN copstr('/',fib.filename+StrLen(fib.filename))
  275.     comset := StrCmp(fnam,fib.filename,flen)
  276.   UNTIL (t=0) OR comset
  277.   IF t AND comset AND ((fnam-bb+StrLen(fib.filename)) < 80)
  278.     copstr(fib.filename,fnam)
  279.   ELSE
  280.     DisplayBeep(NIL)
  281.     clearit()
  282.   ENDIF
  283. ENDPROC
  284.  
  285. PROC copstr(str1,str2)
  286. MOVE.L    str1,A0
  287. MOVE.L    str2,A1
  288. copstr_l1:
  289. MOVE.B    (A0)+,(A1)+
  290. BNE.S copstr_l1
  291. ENDPROC
  292.  
  293. PROC feedit()
  294. DEF raw_char:toraw,iep:inputevent,i=0
  295. iep.nextevent:=NIL
  296. PutLong(iep+10,0)
  297. iep.class:=IECLASS_RAWKEY
  298. io_req.data:=iep
  299. io_req.length:=SIZEOF inputevent
  300. io_req.command:=IND_WRITEEVENT
  301. WHILE todel
  302.   DEC todel
  303.   iep.code := $41
  304.   iep.qualifier := $8000
  305.   DoIO(io_req)
  306. ENDWHILE
  307. WHILE Char(bb+bbp+i)
  308.   MapANSI(bb+bbp+i,1,raw_char,1,NIL)
  309.   iep.code:=raw_char.cd
  310.   iep.qualifier:=raw_char.qu
  311.   DoIO(io_req)
  312.   INC i
  313. ENDWHILE
  314. ENDPROC
  315.  
  316.